﻿#pragma once

#include "p2pms_common.hpp"

#include <vector>
#include <functional>


namespace p2pms
{

//==================================================================================================
// 主线程执行器接口
//==================================================================================================
class IMainThreadExecutor
{
public:
	virtual ~IMainThreadExecutor() = default;

	// 在主线程上执行任务
	virtual void PostToMainThread(std::function<void()> task) = 0;
};

//==================================================================================================
// SDK 事件回调
//==================================================================================================
class IClientHandler
{
public:
	virtual ~IClientHandler() = default;

	// 异步返回登录结果
	virtual void OnLoginResult(bool result) = 0;
	// 通知用户登录
	virtual void OnLoginNotify(const std::string& user_id) = 0;
	// 通知用户登出
	virtual void OnLogoutNotify(const std::string& user_id) = 0;
	// 远端呼叫通知，返回 true 表示接受，false 表示拒绝
	virtual bool OnIncomingCall(const std::string& call_type, const std::string& user_id, 
		const std::string& call_id) = 0;
	// 呼叫状态变化通知
	virtual void OnCallStateChanged(const std::string& call_id, CallState call_state) = 0;
	// 远端开始发布媒体通知
	virtual void OnStartPublish(const std::string& user_id, const MediaInfo& media) = 0;
	// 远端停止发布媒体通知
	virtual void OnStopPublish(const std::string& user_id, const MediaInfo& media) = 0;
	// 本端开始发布媒体结果
	virtual void OnStartPublishResult(const MediaInfo& media, bool result) = 0;
	// 本端停止发布媒体结果
	virtual void OnStopPublishResult(const MediaInfo& media, bool result) = 0;
	// 开始订阅媒体结果
	virtual void OnStartSubscribeResult(const std::string& user_id, const MediaInfo& media, 
		bool result) = 0;
	// 停止订阅媒体结果
	virtual void OnStopSubscribeResult(const std::string& user_id, const MediaInfo& media, 
		bool result) = 0;
};

//==================================================================================================
// 渲染相关
//==================================================================================================
class IRendererManager 
{
public:
	virtual ~IRendererManager() = default;

	// 创建渲染器
	virtual RenderId CreateRenderer(const MediaInfo& media) = 0;
	// 设置渲染窗口
	virtual bool SetRenderWindow(RenderId render_id, void* window_handle) = 0;
	// 刷新渲染
	virtual void RefreshRender(RenderId render_id) = 0;
	// 销毁渲染器
	virtual void DestroyRenderer(RenderId render_id) = 0;
	// 渲染窗口大小变化事件
	virtual void OnRenderWindowSizeChanged(RenderId render_id) = 0;
	// 渲染窗口状态变化事件（最小化/恢复）
	virtual void OnRenderWindowStateChanged(RenderId render_id, bool minimized) = 0;
};

//==================================================================================================
// 渲染相关
//==================================================================================================
class IDeviceManager {
public:
	virtual ~IDeviceManager() = default;
	// 获取设备列表
	virtual ErrCode GetMediaDevList(MediaDeviceType dev_type, std::vector<MediaDevice>& devices) = 0;
	// 选择设备
	virtual ErrCode SelectDevice(const MediaDevice& device) = 0;
	// 获取当前已选设备
	virtual ErrCode GetSelectedDevice(MediaDeviceType dev_type, MediaDevice& device) = 0;
};

//==================================================================================================
// SDK 主接口
//==================================================================================================
class IP2PMSClient
{
public:
	virtual ~IP2PMSClient() = default;

	// 初始化SDK
	virtual ErrCode Init(IMainThreadExecutor* executor, IClientHandler* handler, 
		const std::string& server_addr) = 0;

	// 登录/登出
	virtual ErrCode Login(const std::string& user_id) = 0;
	virtual void Logout() = 0;
	virtual std::vector<std::string> GetUserList() = 0;

	// 呼叫控制
	virtual ErrCode MakeCall(CallMode mode, const std::string& callee_id) = 0;
	virtual void TerminateCall() = 0;

	// 媒体发布订阅
	virtual ErrCode StartPublish(const MediaDevice& device, MediaInfo& media) = 0;
	virtual ErrCode StopPublish(const MediaInfo& media) = 0;
	virtual ErrCode StartSubscribe(const std::string& user_id, const MediaInfo& media) = 0;
	virtual ErrCode StopSubscribe(const std::string& user_id, const MediaInfo& media) = 0;

	// 视频渲染
	virtual IRendererManager* GetRendererManager() = 0;

	// 设备管理
	virtual IDeviceManager* GetDeviceManager() = 0;
};

} // namespace p2pms

// 工厂函数
p2pms::IP2PMSClient* CreateP2PMSClient();
void ReleaseP2PMSClient(p2pms::IP2PMSClient* client);